package com.lingyue.cpd.test.lock;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author deep.wu
 * @version 1.0 on 2020-04-21 00:16.
 */
@Slf4j
public class ReentrantLockTest2 {

    /**
     * ReentrantLock和synchronized不一样的地方，那就是公平锁的实现。
     * 对于公平锁的实现，就要结合着我们的可重入性质了。公平锁的含义我们上面已经说了，就是谁等的时间最长，谁就先获取锁。
     * 首先new一个ReentrantLock的时候参数为true，表明实现公平锁机制。
     */
    //private static final Lock lock = new ReentrantLock(true);

    /**
     * 非公平锁实现
     * 非公平锁那就随机的获取，谁运气好，cpu时间片轮到哪个线程，哪个线程就能获取锁,
     * 和上面公平锁的区别很简单，就在于先new一个ReentrantLock的时候参数为false,
     * 当然我们也可以不写，默认就是false。
     */
    private static final Lock lock = new ReentrantLock(false);

    public static void main(String[] args) {
        new Thread(() -> test1(), "thread-A").start();
        new Thread(() -> test1(), "thread-B").start();
        new Thread(() -> test1(), "thread-C").start();
        new Thread(() -> test1(), "thread-D").start();
        new Thread(() -> test1(), "thread-E").start();
    }

    public static void test1() {
        for (int i = 0; i < 2; i++) {
            try {
                lock.lock();
                log.info("获取锁: {}", Thread.currentThread().getName());
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                log.info("释放锁: {}", Thread.currentThread().getName());
                lock.unlock();
            }
        }

    }
}
